Happiness is a crucial indicator of a country’s quality of life. Furthermore, with the raise of mental health issues around the world, we believe it is important to improve our life condition so that it doesn’t affect our quality of life. In the context of public policy, economics, and public health, understanding the factors that influence happiness can help governments and organizations design more effective policies, which is essential to achieve one of the SDGs, mainly SDG 3: Good Health and Well-being.
This report aims to analyze the World Happiness Report 2023, one of the most comprehensive and well-known happiness surveys globally. This report (WHR2023) presents data from various countries with rigorous methods and reliable data sources. Moreover, it covers various relevant variables such as GDP per capita, social support, healthy life expectancy, freedom to make life choices, generosity, and perceptions of corruption. By using this dataset, our analysis can provide deep and broad insights into the factors influencing global happiness.
The main topic of this report is the analysis of trends and factors influencing global happiness. We will explore how economic, social, and health variables contribute to happiness and how regional differences affect these outcomes. The primary goals of this analysis are to answer several key questions:
What are the main factors influencing happiness in various countries?
What is the relationship between GDP per capita and happiness?
Are there significant differences in happiness levels based on regions?
How do social support and healthy life expectancy contribute to happiness?
Where does Indonesia stand compared to other countries?
In this report, we will use Exploratory Data Analysis (EDA) methods to understand the distribution and relationships between variables. Statistical analysis and data visualization will also be used to illustrate the main findings.
This analysis is highly relevant in various fields. From a public policy perspective, the results can be used to design better programs to enhance societal well-being. Economically, understanding the relationship between GDP and happiness can aid in decision-making regarding investment and resource distribution. In public health, this analysis can provide insights into the importance of physical and mental health in enhancing happiness.
This report is intended for researchers, policymakers, and other stakeholders interested in the factors influencing societal happiness. Additionally, this report is relevant to international organizations, academics, and the general public who wish to gain a deeper understanding of the factors affecting global happiness.
This analysis is based on data available in the World Happiness Report 2023, which is the result of surveys and measurements from various sources. Some assumptions made are that this data is accurate and representative of the broader population. Limitations of the analysis include potential biases in the survey and the challenge of objectively measuring happiness.
This analysis is meaningful because happiness is one of the main goals in human life. By understanding the factors that influence happiness, we hope to provide valuable insights for all parties so that we can work towards a happier, more equitable, more productive, and more prosperous world.
Dataset used: World Happiness Report 2023, a partnership of Gallup, the Oxford Wellbeing Research Centre, the UN Sustainable Development Solutions Network, and the WHR’s Editorial Board.
Source: Helliwell, J. F., Layard, R., Sachs, J. D., Aknin, L. B., De Neve, J.-E., & Wang, S. (Eds.). (2023). World Happiness Report 2023 (11th ed.). Sustainable Development Solutions Network.
World Happiness Report 2023, one of the most comprehensive and well-known happiness surveys globally. This report presents data from various countries with rigorous methods and reliable data sources. Moreover, it covers various relevant variables such as GDP per capita, social support, healthy life expectancy, freedom to make life choices, generosity, and perceptions of corruption, which are related to countries’ happiness score. Description of mentioned variables are as follows:
source("explorationFunction.R")
library(corrplot)
library(ggplot2)
library(dplyr)
library(plotly)
x = read.csv("C:/Users/lenovo/OneDrive - Bina Nusantara/SEMESTER 2/Data Mining and Visualization/assignment 1/WHR_2023.csv")
df = data.frame(x)
Opens a csv file, then converts it to a data frame, and store it in a variable called df.
str(df)
## 'data.frame': 137 obs. of 9 variables:
## $ country : chr "Finland" "Denmark" "Iceland" "Israel" ...
## $ region : chr "Western Europe" "Western Europe" "Western Europe" "Middle East and North Africa" ...
## $ happiness_score : num 7.8 7.59 7.53 7.47 7.4 ...
## $ gdp_per_capita : num 1.89 1.95 1.93 1.83 1.94 ...
## $ social_support : num 1.58 1.55 1.62 1.52 1.49 ...
## $ healthy_life_expectancy : num 0.535 0.537 0.559 0.577 0.545 0.562 0.544 0.582 0.549 0.513 ...
## $ freedom_to_make_life_choices: num 0.772 0.734 0.738 0.569 0.672 0.754 0.752 0.678 0.71 0.672 ...
## $ generosity : num 0.126 0.208 0.25 0.124 0.251 0.225 0.212 0.151 0.149 0.23 ...
## $ perceptions_of_corruption : num 0.535 0.525 0.187 0.158 0.394 0.52 0.463 0.475 0.418 0.471 ...
The data frame has 137 observations with 9 variables, 2 categorical and 7 numerical. The two categorical variables, namely country and region, have character data types. Meanwhile, the numerical variables consist of happiness_score, gdp_per_capita, social_support, healthy_life_expectancy, freedom_to_make_life_choices, generosity, and perceptions_of_corruption. The first 5 observations for each variable in the data frame are also displayed.
summary(df)
## country region happiness_score gdp_per_capita
## Length:137 Length:137 Min. :1.859 Min. :0.000
## Class :character Class :character 1st Qu.:4.724 1st Qu.:1.099
## Mode :character Mode :character Median :5.684 Median :1.449
## Mean :5.540 Mean :1.407
## 3rd Qu.:6.334 3rd Qu.:1.798
## Max. :7.804 Max. :2.200
##
## social_support healthy_life_expectancy freedom_to_make_life_choices
## Min. :0.000 Min. :0.0000 Min. :0.000
## 1st Qu.:0.962 1st Qu.:0.2485 1st Qu.:0.455
## Median :1.227 Median :0.3895 Median :0.557
## Mean :1.156 Mean :0.3662 Mean :0.540
## 3rd Qu.:1.401 3rd Qu.:0.4875 3rd Qu.:0.656
## Max. :1.620 Max. :0.7020 Max. :0.772
## NA's :1
## generosity perceptions_of_corruption
## Min. :0.0000 Min. :0.0000
## 1st Qu.:0.0970 1st Qu.:0.0600
## Median :0.1370 Median :0.1110
## Mean :0.1485 Mean :0.1459
## 3rd Qu.:0.1990 3rd Qu.:0.1870
## Max. :0.4220 Max. :0.5610
##
Displays summary data in the dataframe, in the form of the mean, 5 number summary, and the number of missing values(NA). It can be seen that for the variable healthy_life_expectancy there is 1 null value.
sum(is.na(df))
## [1] 1
which(!complete.cases(df))
## [1] 99
df <- df[-99, ]
rownames(df) <- seq_len(nrow(df))
We checked for NA values in the dataset. NA values or missing values occur when no data value is stored for the variable in observation. It is important to ensure that the dataset used is complete so that the analysis will be reliable. In this dataset, there is 1 null value in row 99 column 5, which is then deleted because its number is insignificant. The data frame now has 136 rows and 9 columns.
sum(duplicated(df))
## [1] 0
We checked if there is any duplicated values in the dataset. A duplicate value is one in which all values in at least one row are identical to all of the values in another row. It is important to check for duplicated values to avoid inconsistencies and maintain accuracy within a dataset. There is no duplicated values in this dataframe.
An outlier is a data point that differs significantly from other observations. It is important to look for outliers in a dataset because it may affect the validity and reliability if statistical tests that may be performed.
FindOutliers(df$happiness_score)
## $summary
## method n nMiss nOut lowLim upLim minNom maxNom
## 1 ThreeSigma 136 0 1 2.115920 8.972963 2.392 7.804
## 2 Hampel 136 0 1 2.288709 9.098291 2.392 7.804
## 3 BoxplotRule 136 0 9 3.882500 8.802500 3.982 7.804
##
## $threeSigma
## index values type
## 1 136 1.859 L
##
## $Hampel
## index values type
## 1 136 1.859 L
##
## $boxplotRule
## index values type
## 1 128 3.694 L
## 2 129 3.545 L
## 3 130 3.495 L
## 4 131 3.435 L
## 5 132 3.207 L
## 6 133 3.204 L
## 7 134 3.138 L
## 8 135 2.392 L
## 9 136 1.859 L
According to the Three Sigma method there is 1 outlier. According to the Hampel method, there is 1 outlier. According to the Boxplot Rule there are 9 outliers.
FindOutliers(df$gdp_per_capita)
## $summary
## method n nMiss nOut lowLim upLim minNom maxNom
## 1 ThreeSigma 136 0 1 0.1070118 2.710826 0.531 2.2
## 2 Hampel 136 0 0 -0.1119017 3.014902 0.000 2.2
## 3 BoxplotRule 136 0 10 0.7476250 2.848375 0.758 2.2
##
## $threeSigma
## index values type
## 1 88 0 L
##
## $Hampel
## [1] index values type
## <0 rows> (or 0-length row.names)
##
## $boxplotRule
## index values type
## 1 88 0.000 L
## 2 97 0.570 L
## 3 108 0.561 L
## 4 113 0.622 L
## 5 124 0.628 L
## 6 126 0.632 L
## 7 130 0.637 L
## 8 132 0.531 L
## 9 134 0.670 L
## 10 136 0.645 L
According to the Three Sigma method there is 1 outlier. According to the Hampel method there are 0 outliers. According to the Boxplot Rule there are 10 outliers.
FindOutliers(df$social_support)
## $summary
## method n nMiss nOut lowLim upLim minNom maxNom
## 1 ThreeSigma 136 0 1 0.1732997 2.136877 0.242 1.62
## 2 Hampel 136 0 2 0.2892381 2.161762 0.327 1.62
## 3 BoxplotRule 136 0 18 0.7390000 2.063500 0.756 1.62
##
## $threeSigma
## index values type
## 1 136 0 L
##
## $Hampel
## index values type
## 1 115 0.242 L
## 2 136 0.000 L
##
## $boxplotRule
## index values type
## 1 86 0.665 L
## 2 93 0.584 L
## 3 99 0.535 L
## 4 101 0.727 L
## 5 107 0.657 L
## 6 108 0.628 L
## 7 115 0.242 L
## 8 117 0.513 L
## 9 118 0.614 L
## 10 119 0.637 L
## 11 121 0.642 L
## 12 124 0.644 L
## 13 125 0.674 L
## 14 129 0.327 L
## 15 130 0.479 L
## 16 134 0.540 L
## 17 135 0.476 L
## 18 136 0.000 L
According to the Three Sigma method there is 1 outlier. According to the Hampel method, there are 2 outliers. According to the Boxplot Rule there are 18 outliers.
FindOutliers(df$healthy_life_expectancy)
## $summary
## method n nMiss nOut lowLim upLim minNom maxNom
## 1 ThreeSigma 136 0 0 -0.1038968 0.8362498 0.000 0.702
## 2 Hampel 136 0 0 -0.1308926 0.9098926 0.000 0.702
## 3 BoxplotRule 136 0 15 0.1290000 0.8460000 0.137 0.702
##
## $threeSigma
## [1] index values type
## <0 rows> (or 0-length row.names)
##
## $Hampel
## [1] index values type
## <0 rows> (or 0-length row.names)
##
## $boxplotRule
## index values type
## 1 91 0.072 L
## 2 93 0.120 L
## 3 95 0.092 L
## 4 96 0.118 L
## 5 97 0.000 L
## 6 103 0.107 L
## 7 113 0.043 L
## 8 115 0.124 L
## 9 119 0.106 L
## 10 127 0.095 L
## 11 131 0.087 L
## 12 132 0.105 L
## 13 133 0.069 L
## 14 134 0.092 L
## 15 136 0.087 L
According to the Three Sigma method there are 0 outliers. According to the Hampel method there are 0 outliers. According to the Boxplot Rule there are 15 outliers.
FindOutliers(df$freedom_to_make_life_choices)
## $summary
## method n nMiss nOut lowLim upLim minNom maxNom
## 1 ThreeSigma 136 0 1 0.09189811 0.9899254 0.117 0.772
## 2 Hampel 136 0 1 0.11272000 1.0022800 0.117 0.772
## 3 BoxplotRule 136 0 13 0.35975000 0.9537500 0.363 0.772
##
## $threeSigma
## index values type
## 1 136 0 L
##
## $Hampel
## index values type
## 1 136 0 L
##
## $boxplotRule
## index values type
## 1 58 0.248 L
## 2 81 0.252 L
## 3 94 0.346 L
## 4 98 0.351 L
## 5 100 0.281 L
## 6 102 0.320 L
## 7 105 0.125 L
## 8 109 0.259 L
## 9 118 0.286 L
## 10 126 0.187 L
## 11 129 0.117 L
## 12 135 0.123 L
## 13 136 0.000 L
According to the Three Sigma method there is 1 outlier. According to the Hampel method, there is 1 outlier. According to the Boxplot Rule there are 13 outliers.
FindOutliers(df$generosity)
## $summary
## method n nMiss nOut lowLim upLim minNom maxNom
## 1 ThreeSigma 136 0 2 -0.07889173 0.3770682 0.000 0.332
## 2 Hampel 136 0 2 -0.08711390 0.3621139 0.000 0.332
## 3 BoxplotRule 136 0 12 0.04812500 0.3503750 0.053 0.332
##
## $threeSigma
## index values type
## 1 84 0.422 U
## 2 116 0.400 U
##
## $Hampel
## index values type
## 1 84 0.422 U
## 2 116 0.400 U
##
## $boxplotRule
## index values type
## 1 24 0.044 L
## 2 47 0.009 L
## 3 56 0.031 L
## 4 58 0.008 L
## 5 90 0.000 L
## 6 94 0.036 L
## 7 99 0.013 L
## 8 109 0.022 L
## 9 120 0.038 L
## 10 131 0.021 L
## 11 84 0.422 U
## 12 116 0.400 U
According to the Three Sigma method there are 2 outliers. According to the Hampel method, there are 2 outliers. According to the Boxplot Rule there are 12 outliers.
FindOutliers(df$perceptions_of_corruption)
## $summary
## method n nMiss nOut lowLim upLim minNom maxNom
## 1 ThreeSigma 136 0 2 -0.2345482 0.5275041 0 0.525
## 2 Hampel 136 0 12 -0.1437485 0.3677485 0 0.365
## 3 BoxplotRule 136 0 11 -0.0045000 0.3810000 0 0.372
##
## $threeSigma
## index values type
## 1 1 0.535 U
## 2 25 0.561 U
##
## $Hampel
## index values type
## 1 1 0.535 U
## 2 2 0.525 U
## 3 5 0.394 U
## 4 6 0.520 U
## 5 7 0.463 U
## 6 8 0.475 U
## 7 9 0.418 U
## 8 10 0.471 U
## 9 14 0.409 U
## 10 25 0.561 U
## 11 31 0.372 U
## 12 82 0.390 U
##
## $boxplotRule
## index values type
## 1 1 0.535 U
## 2 2 0.525 U
## 3 5 0.394 U
## 4 6 0.520 U
## 5 7 0.463 U
## 6 8 0.475 U
## 7 9 0.418 U
## 8 10 0.471 U
## 9 14 0.409 U
## 10 25 0.561 U
## 11 82 0.390 U
According to the Three Sigma method there are 2 outliers. According to the Hampel method there are 12 outliers. According to the Boxplot Rule there are 11 outliers.
In deciding whether the outliers should be removed or not, we considered a couple points. First of all, this dataset has a small number of observations, of only 136 observation. Hence, each observation represents the dataset’s natural variability. That’s why from this point of view, we shouldn’t remove the outliers so that we won’t reduce the dataset’s reliability.
#Z score method
sd(df$happiness_score)
## [1] 1.142841
threshold <- sd(df$happiness_score) * 3
dfCleaned <- df %>%
filter(abs(happiness_score - mean(happiness_score)) < threshold)
sd(dfCleaned$happiness_score)
## [1] 1.101689
From statistical point of view, we also did a test on how far the standard deviation of the happiness score variable change after the outliers are removed. Before the outliers are removed, the standard deviation is 1.142841. After the outliers are removed, the standard deviation becomes 1.101689. Because the difference is not significant, the outliers are not needed to be removed.
We performed data exploration using the Exploratory Data Analysis (EDA) method. EDA is an approach of analyzing data sets to summarize their main characteristics, often using statistical graphics and other data visualization methods. We used this method to help us gain insights, identify patterns, and communicate findings easier.
happinessByRegion <- df %>%
group_by(region) %>%
summarize(mean_happiness = mean(happiness_score, na.rm = TRUE))
ggplot(happinessByRegion,
aes(x = reorder(region, -mean_happiness), y = mean_happiness)) +
geom_bar(stat = "identity", fill = "#458B74", color = "gray") +
geom_text(aes(label = round(mean_happiness, 2)), vjust = -0.5) +
labs(x = "Region", y = "Mean Happiness Score", title = "Mean Happiness Score by Region") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
The bar plot shows a comparison between the average happiness_score per region. It was found that North America and ANZ (Australia and New Zealand) had the highest happiness_score of 7.02.
data_sorted <- df[order(-df$happiness_score), ]
top_5_happy <- data_sorted[1:5, ]
plot_ly(x = factor(top_5_happy$country, levels = top_5_happy$country),
y = top_5_happy$happiness_score,
type = 'bar',
)
Here is a simple bar graph on the top 5 countries with the highest happiness level in 2023. We can see that Finland is the happiest country in 2023. We can see its happiness level when we hover through its bar, which is 7.804. Followed by Denmark, with a happiness level of 7.586, Iceland with a happiness level of 7.53, Israel with a happiness level of 7.473, and rounding the top 5, Netherlands with a happiness level of 7.403.
Statistical analysis is the science of collecting, exploring and presenting large amounts of data to discover underlying patterns and trends. We performed a correlation test among numerical variables, which is the happiness score variable and factors that may influence happiness score. We did this test because we wanted to know which factor variables correlate with happiness score the most, how strongly they are correlated, and the direction of the correlation.
newDf <- subset(df, select = -c(region, country))
c <- cor(newDf)
corrplot(c, type="upper", method="number")
This correlation plot displays the correlation between variables. The darker the color and the closer the number is to -1.0 or 1.0, the greater the correlation between the variables. For example, the correlation between happiness_score and gdp_per_capta is 0.78. Because 0.78 is close to 1.0, happiness_score and gdp_per_capita are strongly correlated. Meanwhile, the correlation between healthy_life_expectancy and generosity is only 0.14, therefore the correlation is weak. It can be concluded that the happiness_score variable has a strong correlation with gdp_per_capita, social_support, healthy_life_expectancy, and freedom_to_make_life_choices.
hgdp <- ggplot(data=df, mapping=aes(x=gdp_per_capita,y=happiness_score)) +
geom_point(pch=21,color="steelblue",fill="darkgray",size=2) +
labs(x="GDP",y="Happiness Score", title = "Happiness Score & GDP") +
geom_smooth(method="lm")
ggplotly(hgdp)
happiness_score and gdp_per_capita have a linear relationship. The higher the happiness_score, the higher the gdp_per_capita.
hs <- ggplot(data=df, mapping=aes(x=social_support,y=happiness_score)) +
geom_point(pch=21,color="steelblue",fill="darkgray",size=2) +
labs(x="Social Support",y="Happiness Score", title = "Happiness Score & Social Support") +
geom_smooth(method="lm")
ggplotly(hs)
happiness_score and social_support have a linear relationship. The higher the happiness_score, the higher the social_support.
hh <- ggplot(data=df, mapping=aes(x=healthy_life_expectancy,y=happiness_score)) +
geom_point(pch=21,color="steelblue",fill="darkgray",size=2) +
labs(x="Healthy Life Expectancy",y="Happiness Score", title = "Happiness Score & Healthy Life Expectancy") +
geom_smooth(method="lm")
ggplotly(hh)
happiness_score and healthy_life_expectancy have a linear relationship. The higher the happiness_score, the higher the healthy_life_expectancy.
hf <- ggplot(data=df, mapping=aes(x=freedom_to_make_life_choices,y=happiness_score)) +
geom_point(pch=21,color="steelblue",fill="darkgray",size=2) +
labs(x="Freedom to Make Life Choices",y="Happiness Score", title = "Happiness Score & Freedom to Make Life Choices") +
geom_smooth(method="lm")
ggplotly(hf)
happiness_score and freedom_to_make_life_choices have a linear relationship. The higher the happiness_score, the higher the freedom_to_make_life_choices.
sg <- ggplot(data=df, mapping=aes(x=gdp_per_capita,y=social_support)) +
geom_point(pch=21,color="steelblue",fill="darkgray",size=2) +
labs(x="GDP",y="Social Support", title = "Social Support & GDP") +
geom_smooth(method="lm")
ggplotly(sg)
gdp_per_capita and social_support have a linear relationship. The higher gdp_per_capita, the higher social_support.
hg <- ggplot(data=df, mapping=aes(x=gdp_per_capita,y=healthy_life_expectancy)) +
geom_point(pch=21,color="steelblue",fill="darkgray",size=2) +
labs(x="GDP",y="Healthy Life Expectancy", title = "Healthy Life Expectancy & GDP") +
geom_smooth(method="lm")
ggplotly(hg)
gdp_per_capita and healthy_life_expectancy have a linear relationship. The higher gdp_per_capita, the higher healthy_life_expectancy.
indonesias <- df %>%
filter(country == "Indonesia")
others <- df %>%
filter(country != "Indonesia")
rows <- c("happiness_score", "gdp_per_capita", "social_support", "healthy_life_expectancy", "freedom_to_make_life_choices", "generosity", "perceptions_of_corruption")
comparison <- data.frame(Index = rows,
Indonesia = c(indonesias$happiness_score, indonesias$gdp_per_capita, indonesias$social_support, indonesias$healthy_life_expectancy, indonesias$freedom_to_make_life_choices, indonesias$generosity, indonesias$perceptions_of_corruption),
Other = c(mean(others$happiness_score), mean(others$gdp_per_capita), mean(others$social_support), mean(others$healthy_life_expectancy), mean(others$freedom_to_make_life_choices), mean(others$generosity), mean(others$perceptions_of_corruption))
)
comparison_long <- tidyr::pivot_longer(comparison, cols = c(Indonesia, Other),
names_to = "Country", values_to = "Value")
gg <- ggplot(comparison_long, aes(x = Value, y = Index, fill = Country)) +
geom_bar(stat = "identity", position = position_dodge()) +
labs(title = "Comparison of Factors between Indonesia and Other Countries",
x = "Value", y = "Index") +
scale_fill_manual(values = c("Indonesia" = "red", "Other" = "grey")) +
theme_minimal()
ggplotly(gg)
Dataframe comparison compares the values of each variable for Indonesia with other countries, which is then illustrated in this grouped bar chart. With this dataframe, we can compare the condition of Indonesia’s happiness rate with other countries and the variables that influence it. Based on the dataframe comparison above, Indonesia’s happiness_score is slightly below the average happiness_score of other countries, as well as variables such as gdp_per_capita, healthy_life_expectancy, and perceptions_of_corruption. Meanwhile, variables such as social_support, freedom_to_make_life_choices, and generosity are slightly above the average for other countries. Thus, Indonesia’s overall happiness_score is 5,277.
Happiness score differs between each region. We can conclude that the
top 3 happiest regions are North America and the Australia/New Zealand
(ANZ), Western Europe, and Eastern and Central Europe. Meanwhile, the
top 5 happiest countries are Finland, Denmark, Iceland, Israel, and the
Netherlands.
We did a correlation test between the happiness score variable and each
of the factor variables to determine which influences countries’
happiness the most. The results show that happiness score is most
strongly correlated with social support. This puts emphasis on the
importance of social connections and the fact that humans are social
beings who thrive on the support of family, friends, and community to
enhance their quality of life.
We also explored the impact of financial conditions on happiness. Our
correlation test revealed that GDP per capita is highly correlated with
healthy life expectancy and social support, with correlations of 84% and
74% respectively. This indicates that higher GDP per capita is
associated with better healthcare, education, and infrastructure.
Essentially, as GDP per capita increases, people gain greater access to
social and healthcare facilities and services.
Lastly, we examined where Indonesia stands compared to other countries.
We compared Indonesia’s scores for each variable with the average scores
of other countries and presented this in the form of a grouped bar
chart. Indonesia has a happiness score of 5.28, slightly lower than the
global average of 5.54. Indonesia also has slightly lower scores in
variables such as GDP per capita, healthy life expectancy, and
perception of corruption. However, Indonesia scores higher than the
global average in social support, freedom to make life choices, and
generosity. In fact, Indonesia has the highest score in terms of
generosity. This indicates that while there are areas where improvements
can be made, Indonesia excels in social support and generosity.
In conclusion, these findings underscore the multifaceted nature of happiness and suggest that an approach focusing on social, economic, and health-related factors, is essential for fostering well-being and enhancing happiness globally. Indonesia, in particular, should focus on improving economic conditions and governance to enhance its people’s quality of life. By understanding and addressing these key factors, we can work towards creating a happier and more prosperous world for all.
Helliwell, J. F., Layard, R., Sachs, J. D., Aknin, L. B., De Neve, J.-E., & Wang, S. (Eds.). (2023). World Happiness Report 2023 (11th ed.). Sustainable Development Solutions Network.